package com.quiz.common.mybatis.core.query;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.NoArgsConstructor;

/**
 * 拓展 MyBatis Plus和MPJ Wrappers 类，主要增加如下功能：
 * <p>
 * 整合并增强Wrappers和MPJWrappers的功能
 *
 * @author ahuan
 */
@NoArgsConstructor
public class PlusWrappers {

    /**================================ 拓展 MPJWrappers ================================**/
    public static <T> MPJLambdaWrapperPlus<T> queryJoin() {
        return new MPJLambdaWrapperPlus();
    }

    public static <T> MPJLambdaWrapperPlus<T> queryJoin(T entity) {
        return new MPJLambdaWrapperPlus(entity);
    }

    public static <T> MPJLambdaWrapperPlus<T> queryJoin(Class<T> entityClass) {
        return new MPJLambdaWrapperPlus(entityClass);
    }

    public static <T> MPJLambdaWrapperPlus<T> lambdaJoin() {
        return new MPJLambdaWrapperPlus();
    }

    public static <T> MPJLambdaWrapperPlus<T> lambdaJoin(T entity) {
        return new MPJLambdaWrapperPlus(entity);
    }

    public static <T> MPJLambdaWrapperPlus<T> lambdaJoin(Class<T> entityClass) {
        return new MPJLambdaWrapperPlus(entityClass);
    }


    /**================================ 拓展 Wrappers ================================**/

    /**
     * 获取 QueryWrapper&lt;T&gt;
     *
     * @param <T> 实体类泛型
     * @return QueryWrapper&lt;T&gt;
     */
    public static <T> QueryWrapperPlus<T> query() {
        return new QueryWrapperPlus<>();
    }

    /**
     * 获取 QueryWrapper&lt;T&gt;
     *
     * @param entity 实体类
     * @param <T>    实体类泛型
     * @return QueryWrapper&lt;T&gt;
     */
    public static <T> QueryWrapperPlus<T> query(T entity) {
        return new QueryWrapperPlus<>(entity);
    }

    /**
     * 获取 QueryWrapper&lt;T&gt;
     *
     * @param entityClass 实体类class
     * @param <T>    实体类泛型
     * @return QueryWrapper&lt;T&gt;
     */
    public static <T> QueryWrapperPlus<T> query(Class<T> entityClass) {
        return new QueryWrapperPlus<>(entityClass);
    }

    /**
     * 获取 LambdaQueryWrapper&lt;T&gt;
     *
     * @param <T> 实体类泛型
     * @return LambdaQueryWrapper&lt;T&gt;
     */
    public static <T> LambdaQueryWrapperPlus<T> lambdaQuery() {
        return new LambdaQueryWrapperPlus<>();
    }

    /**
     * 获取 LambdaQueryWrapper&lt;T&gt;
     *
     * @param entity 实体类
     * @param <T>    实体类泛型
     * @return LambdaQueryWrapper&lt;T&gt;
     */
    public static <T> LambdaQueryWrapperPlus<T> lambdaQuery(T entity) {
        return new LambdaQueryWrapperPlus<>(entity);
    }

    /**
     * 获取 LambdaQueryWrapper&lt;T&gt;
     *
     * @param entityClass 实体类class
     * @param <T>         实体类泛型
     * @return LambdaQueryWrapper&lt;T&gt;
     * @since 3.3.1
     */
    public static <T> LambdaQueryWrapperPlus<T> lambdaQuery(Class<T> entityClass) {
        return new LambdaQueryWrapperPlus<>(entityClass);
    }

    /**
     * 获取 UpdateWrapper&lt;T&gt;
     *
     * @param <T> 实体类泛型
     * @return UpdateWrapper&lt;T&gt;
     */
    public static <T> UpdateWrapper<T> update() {
        return new UpdateWrapper<>();
    }

    /**
     * 获取 UpdateWrapper&lt;T&gt;
     *
     * @param entity 实体类
     * @param <T>    实体类泛型
     * @return UpdateWrapper&lt;T&gt;
     */
    public static <T> UpdateWrapper<T> update(T entity) {
        return new UpdateWrapper<>(entity);
    }

    /**
     * 获取 LambdaUpdateWrapper&lt;T&gt;
     *
     * @param <T> 实体类泛型
     * @return LambdaUpdateWrapper&lt;T&gt;
     */
    public static <T> LambdaUpdateWrapper<T> lambdaUpdate() {
        return new LambdaUpdateWrapper<>();
    }

    /**
     * 获取 LambdaUpdateWrapper&lt;T&gt;
     *
     * @param entity 实体类
     * @param <T>    实体类泛型
     * @return LambdaUpdateWrapper&lt;T&gt;
     */
    public static <T> LambdaUpdateWrapper<T> lambdaUpdate(T entity) {
        return new LambdaUpdateWrapper<>(entity);
    }

    /**
     * 获取 LambdaUpdateWrapper&lt;T&gt;
     *
     * @param entityClass 实体类class
     * @param <T>         实体类泛型
     * @return LambdaUpdateWrapper&lt;T&gt;
     * @since 3.3.1
     */
    public static <T> LambdaUpdateWrapper<T> lambdaUpdate(Class<T> entityClass) {
        return new LambdaUpdateWrapper<>(entityClass);
    }

    /**
     * 获取 EmptyWrapper&lt;T&gt;
     *
     * @param <T> 任意泛型
     * @return EmptyWrapper&lt;T&gt;
     */
    public static <T> QueryWrapper<T> emptyWrapper() {
        return Wrappers.emptyWrapper();
    }

}
